home *** CD-ROM | disk | FTP | other *** search
/ Linux Cubed Series 2: Applications / Linux Cubed Series 2 - Applications.iso / math / gle-3.000 / gle-3 / gle / unixinkey.c < prev    next >
C/C++ Source or Header  |  1995-02-07  |  6KB  |  333 lines

  1. #include <stdio.h>
  2. #include <ctype.h>
  3. #include <string.h>
  4. #include <assert.h>
  5. #ifdef ultrix
  6. #include <cursesX.h>
  7. #else
  8. #include <curses.h>
  9. #endif
  10. #include "edt.h"
  11. #define true (!false)
  12. #define false 0
  13.  
  14. #ifdef NOKEYPAD
  15. #include "nofnkeys.h"
  16. #endif
  17.  
  18. int fner(char *s);
  19. int scr_refresh(void);
  20. int scr_getch(void);
  21. char *function_bar()
  22. {
  23.   static int ab;
  24.   if (ab==0) ab=1;
  25.   ab = 3-ab;
  26.   if (ab==1) {
  27.     #ifndef LINUXFKEY /* a.r.: only F1-F10 on AT keyboards */
  28.     return "F11-Help F12-Save F13-Load F14-Saveas F9-Graphmenu F10-Drawit ^x=Exit";
  29.     #else
  30.     return "F1-Help F2-Save F3-Load F4-Saveas F9-Graphmenu F10-Drawit ^x=Exit";
  31.     #endif
  32.       } else {
  33.     return "^F 1 =Help, ^F 2 = Save, ^F 3 = Load,      ^F 9 Graphmenu ^F 0 Drawit";
  34.       }
  35. }
  36.  
  37. struct escape_struct {char *str; int val;};
  38.  
  39. struct escape_struct gold[] = {
  40.         "v",     epaste,
  41.         "R",    esearch,
  42.         "S",    eundeleol,
  43.         NULL,    };
  44. #ifndef LINUXFKEY
  45. struct escape_struct eseq[] = {
  46.         "4~",     eselect,
  47.         "1~",    esearch,
  48.         "2~",    epaste,
  49.         "3~",    ecut,
  50.         "4~",    eselect,
  51.         "5~",    epageup,
  52.         "6~",    epagedown,
  53.         "A",    eup,
  54.         "B",    edown,
  55.         "C",    eright,
  56.         "D",    eleft,
  57.         "20~",    egraphmenu,
  58.         "21~",    edrawit,
  59.         "23~",    ehelp,
  60.         "24~",    esave,
  61.         "25~",    eload,
  62.         "26~",    esaveas,
  63.         "P",    egold,
  64.         "Q",    ehelp,
  65.         "R",    efindnext,
  66.         "S",    edeleol,
  67.         "n",    eselect,
  68.         "v",    ecut,
  69.         "l",    edelright,
  70.         NULL,    };
  71. #else /* a.r.: X11 escape sequences for F-keys were added */
  72. struct escape_struct eseq[] = {
  73.         "2~",    epaste,
  74.         "5~",    epageup,
  75.         "6~",    epagedown,
  76.         "A",    eup,
  77.         "B",    edown,
  78.         "C",    eright,
  79.         "D",    eleft,
  80.         "20~",    egraphmenu,
  81.         "21~",    edrawit,
  82.         "23~",    ehelp,
  83.         "11~",  ehelp,
  84.         "24~",    esave,
  85.         "12~",  esave,
  86.         "25~",    eload,
  87.         "13~",  eload,
  88.         "26~",    esaveas,
  89.         "14~",  esaveas,
  90. #ifndef MANIP
  91.         "15~",     eshowerror,
  92. #endif
  93.         "P",    egold,
  94.         "Q",    ehelp,
  95.         "R",    efindnext,
  96.         "S",    edeleol,
  97.         "n",    eselect,
  98.         "v",    ecut,
  99.         "l",    edelright,
  100.         "3~",    edelright,
  101.         "1~",    ebol,
  102.         "4~",    eeol,
  103.         NULL,    };
  104. #endif
  105. int gold_fn[] = {
  106.     edrawit,ehelp,esave,eload,esaveas,eshowerror,0,0,0,egraphmenu,edrawit
  107. };
  108. struct keymatch {int m; int val;};
  109. /* Normal key and ^ commands  commands */
  110. #ifndef LINUXFKEY /* a.r. */
  111. struct keymatch kmatch2[] = {
  112.     13, ereturn,
  113.     3, equit,
  114.     4, eword,
  115.     5, eedt,
  116.     6, efast,
  117.     7, edrawit,
  118.     8, edelete,
  119.     18, eshowerror,
  120.     8, ehelp,
  121.     20, etrace,
  122.     12, efindnext,
  123.     21, eundelline,
  124.     24, eescape,
  125.     25, edelline,
  126.     26, eescape,
  127.     27, eescape,
  128.     127, edelete,
  129.     0,0
  130. };
  131. #else
  132. struct keymatch kmatch2[] = {
  133.     13, ereturn,
  134.     3, equit,
  135. /*    23, eword,    eword does not exist! */
  136.     1, ebol, /* a.r. bol and eol like EMACS and Joe */
  137.     5, eeol,
  138.     4, edelright, /*  delete the char at the cursor-position */
  139.     6, efast,
  140.     7, edrawit,
  141.     8, edelete,
  142.     18, eshowerror,
  143.     8, ehelp,
  144.     20, etrace,
  145.     12, efindnext,
  146.     21, eundelline,
  147.     24, eescape,
  148.     25, edelline,
  149.     26, eescape,
  150.     27, eescape,
  151.     127, edelete,
  152.     0,0
  153. };
  154. #endif
  155. struct keymatch kmatchx[] = {
  156.     KEY_DOWN, edown,
  157.     KEY_UP, eup,
  158.     KEY_F0+4, edeleol,
  159.     KEY_LEFT, eleft,
  160.     KEY_RIGHT, eright,
  161.     KEY_NPAGE, epagedown,
  162.     KEY_PPAGE, epageup,
  163.     0,0
  164. };
  165. /* Control K commands */
  166. #ifndef LINUXFKEY    /* a.r. */
  167. struct keymatch kmatch3[] = {
  168.     'b', eselect,
  169.     'v', emove,
  170.     'k', emark,
  171.     'c', ecopy,
  172.     'y', ecut,
  173.     'u', epaste,
  174.     'p', epaste,
  175.     'r', eblockread,
  176.     'w', eblockwrite,
  177.     'm', egraphmenu,
  178.     'l', eload,
  179.     'd', edrawit,
  180.     's', esave,
  181.     'x', equit,
  182.     0,0
  183. };
  184. #else
  185. struct keymatch kmatch3[] = {
  186.     'b', eselect,
  187.     'v', emove,
  188.     'k', emark,
  189.     'c', ecopy,
  190.     'y', ecut,
  191.     'u', epaste,
  192.     'p', epaste,
  193.     'r', eblockread,
  194.     'w', eblockwrite,
  195.     'm', egraphmenu,
  196.     'l', eload,
  197.     'd', edrawit,
  198.     's', esave,
  199.     'x', equit,
  200.     'f', esearch, /* like Joe's Own Editor */
  201.     0,0
  202. };
  203. #endif
  204.  
  205. /* Control Q commands */
  206. struct keymatch kmatch4[] = {
  207.     'f', esearch,
  208.     'c', eendoffile,
  209.     'r', etopoffile,
  210.     0,0
  211. };
  212. extern int noscreenio;
  213. tt_inkey()
  214. {
  215.     int i;
  216.     if (noscreenio) return getc(stdin);
  217.     else {
  218.         i = getch();
  219.             /* printw("{%d} ",i); */
  220.         return i;
  221.     }
  222. }
  223.  
  224. text_inkey()
  225. {
  226.     int cc,i,c1,c2;
  227.  
  228.     scr_refresh();
  229.  
  230. loop1:    cc = tt_inkey();
  231.     c2 = cc;
  232.     if (c2==6) return do_fnkey();
  233.     if (c2==KEY_F(1)) return do_gold();
  234.     if (cc>KEY_BREAK) {
  235.         for (i=0;kmatchx[i].m!=0;i++)
  236.         if (kmatchx[i].m==c2) return kmatchx[i].val;
  237.     }
  238.     switch(c2) {
  239.       default:
  240.         for (i=0;kmatch2[i].m!=0;i++)
  241.         if (kmatch2[i].m==c2) return kmatch2[i].val;
  242.         break;
  243.       case 27:
  244.         c2 = tt_inkey(); /* throw away next char (unless escape) */
  245.         if (c2==27) return eescape;
  246.       case -101:
  247.       case -113:
  248.         c2 = escape_seq();
  249.         if (c2==egold)     return do_gold();
  250.         return c2;
  251.         break;
  252.       case 17:
  253.         fner("^Q  F=Find string,  R=Top of file");
  254.         cc = tt_inkey();
  255.         c2 = (cc & 0xff);
  256.         if (c2<32) c2 = c2 + 'a' - 1;
  257.         c2 = tolower(c2);
  258.         for (i=0;kmatch4[i].m!=0;i++)
  259.         if (kmatch4[i].m==c2) return kmatch4[i].val;
  260.         fner("Unrecognized Quick movement command");
  261.         goto loop1;
  262.       case 11:
  263.         fner("^K  B=begin block,  P=Paste,  (use KP6 for Cut),  K=End block");
  264.         cc = tt_inkey();
  265.         c2 = (cc & 0xff);
  266.         if (c2<32) c2 = c2 + 'a' - 1;
  267.         c2 = tolower(c2);
  268.         for (i=0;kmatch3[i].m!=0;i++)
  269.         if (kmatch3[i].m==c2) return kmatch3[i].val;
  270.         fner("Unrecognized block command");
  271.         goto loop1;
  272.     }
  273.     return c2;
  274. }
  275. escape_seq()
  276. {
  277.     int cc,i;
  278.     unsigned char esq[10];
  279.     char *s;
  280.  
  281.     s = &esq[0];
  282.     *s++ = cc = tt_inkey();
  283.     while (cc<65) *s++ = cc = tt_inkey();
  284.     *s++ = 0;
  285.     for (i=0;eseq[i].str!=NULL;i++)
  286.         if (strcmp(eseq[i].str,esq)==0) break;
  287.     if (eseq[i].str!=NULL)
  288.         return eseq[i].val;
  289.     else
  290.         return 0;
  291.  
  292. }
  293. escape_seq_gold()
  294. {
  295.     int cc,i;
  296.     unsigned char esq[10];
  297.     char *s;
  298.  
  299.     s = &esq[0];
  300.     *s++ = cc = tt_inkey();
  301.     while (cc<65) *s++ = cc = tt_inkey();
  302.     *s++ = 0;
  303.     for (i=0;gold[i].str!=NULL;i++)
  304.         if (strcmp(gold[i].str,esq)==0) break;
  305.     if (gold[i].str!=NULL)
  306.         return gold[i].val;
  307.     else
  308.         return 0;
  309.  
  310. }
  311. do_fnkey()
  312. {
  313.   int c2;
  314.   fner("1=Help 2=Save 3=Load 4=Saveas 9=Graph_menu     0=Drawit");
  315.   c2 = tt_inkey();
  316.   if  (isdigit(c2)) {
  317.            return gold_fn[c2-'0'];
  318.   }
  319. }
  320. do_gold()
  321. {
  322.     int c2;
  323.     c2 = tt_inkey();
  324.     if (c2==KEY_F(4)) return eundeleol;
  325.     if (c2==27) {
  326.         tt_inkey();
  327.         return escape_seq_gold();
  328.     } else if (isdigit(c2)) {
  329.         return gold_fn[c2-'0'];
  330.     }
  331. }
  332.  
  333.